package com.itheima.d6_lambda;


/**
 *  Lambda表达式是JDK 8开始新增的一种语法形式； 作用：用于简化匿名内部类的代码写法。
 *  格式：                 注意 :  Lambda表达式只能简化函数式接口的匿名内部类!!!
 *
 *  (被重写方法的形参列表) -> {
 *  被重写方法的方法体代码。
 *  }
 *
 * 什么是函数式接口？
 * 有且仅有一个抽象方法的接口。
 * 注意：将来我们见到的大部分函数式接口，上面都可能会有一个@FunctionalInterface的注解，有该注解的接口就必定是函数式接口。
 *
 */

/**
 * Lambda表达式的省略写法(进一步简化Lambda表达式的写法)
 * 参数类型可以省略不写。
 * 如果只有一个参数，参数类型可以省略，同时()也可以省略。
 * 如果Lambda表达式中的方法体代码只有一行代码，可以省略大括号不写，同时要省略分号！此时，如果这行代码是return语句，也必须去掉return不写。
 *
 */

public class LambdaTest1 {
    public static void main(String[] args) {
        // 目标：认识Lambda表达式.
        Animal a = new Animal(){  //以前的写法
            @Override
            public void run() {
                System.out.println("狗跑的贼快~~");
            }
        };
        a.run();

          // 注意：Lambda表达式并不是说能简化全部匿名内部类的写法，只能简化函数式接口的匿名内部类。
         // 报错， 错误的代码！
     /*   Animal a = () -> {
            System.out.println("狗跑的贼快~~");
        };
        a.run();*/

         Swimming s = new Swimming(){
             @Override
             public void swim() {
                 System.out.println("完整版匿名内部类的，学生快乐的游泳~~~~");
             }
         };
         s.swim();

         //上述代码简化之后
        Swimming s1 = () -> {
              System.out.println("Lambda表达式简化之后的，学生快乐的游泳~~~~");
        };
        s1.swim();

        //自己写一遍
        Swimming ss = new Swimming() {
            @Override
            public void swim() {
                System.out.println("===完整版匿名内部类，自己写的====");
            }
        };
        ss.swim();

        Swimming ss1 = ()->{
            System.out.println("=======Lambda表达式只能简化函数式接口的匿名内部类=======");
        };
        ss1.swim();
    }
}

interface Swimming{
    void swim();
}

abstract class Animal{
    public abstract void run();
}